package bombita.controlador;

import java.awt.event.KeyEvent;
import java.io.FileWriter;
import java.io.IOException;

import org.jdom2.Element;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;

import bombita.modelo.Direccion;
import bombita.modelo.Juego;
import bombita.modelo.Personajes.Personaje;
import bombita.vista.Titiritero.VentanaPrincipal;
import bombita.vista.Titiritero.VistaMapaTitiritero;

import ar.uba.fi.algo3.titiritero.controlador.KeyPressedObservador;

public class ControladorHeroe implements KeyPressedObservador, ControladorPersonaje
{
	private Juego juego;
	private Personaje controlado;
	private String id;
	
	public ControladorHeroe (String id)
	{
		this.setId(id);
		VentanaPrincipal.instance().controlador().agregarKeyPressObservador(this);
	}

	@Override
	public String getId()
	{
		return id;
	}

	@Override
	public void setId(String id)
	{
		this.id = id;
	}
	
	@Override
	public void agregarControlado(Personaje aControlar) throws DemasiadosControladosException
	{
		if (this.puedeControlarUnPersonajeMas()) {
			controlado = aControlar;
		} else {
			throw new DemasiadosControladosException();
		}
	}

	@Override
	public boolean puedeControlarUnPersonajeMas()
	{
		return (controlado == null);
	}

	@Override
	public void inicioJuego() {}

	@Override
	public void agregarVista(Juego juego)
	{
		this.juego = juego;
		juego.getMapa().agregarVista(new VistaMapaTitiritero());
	}

	@Override
	public void terminoJuego() {}

	@Override
	public void keyPressed(KeyEvent event)
	{
		switch (event.getKeyCode()) {
		case KeyEvent.VK_UP:
			controlado.mover(Direccion.ABAJO);
			break;
		case KeyEvent.VK_DOWN:
			controlado.mover(Direccion.ARRIBA);
			break;
		case KeyEvent.VK_LEFT:
			controlado.mover(Direccion.IZQUIERDA);
			break;
		case KeyEvent.VK_RIGHT:
			controlado.mover(Direccion.DERECHA);
			break;
		case KeyEvent.VK_S:
			//TODO reemplazar por codigo que escriba a archivo arbitrario
			try {
				FileWriter writer = new FileWriter("salvado.xml");
				XMLOutputter xout = new XMLOutputter(Format.getPrettyFormat());
				xout.output(juego.serializar(), writer);
				writer.flush();
				writer.close();
			} catch (IOException e) {};
			break;
		case KeyEvent.VK_ESCAPE:
			juego.getMapa().terminarJuego(false);
			break;
		case KeyEvent.VK_SPACE:
			controlado.disparar();
			break;
		} 
	}
	
	@Override
	public void keyReleased(KeyEvent event)
	{
		switch (event.getKeyCode()) {
		case KeyEvent.VK_UP:
		case KeyEvent.VK_DOWN:
		case KeyEvent.VK_LEFT:
		case KeyEvent.VK_RIGHT:
			controlado.mover(null);
			break;
		}
	}
	
	public static ControladorHeroe deserializar(Element nodo)
	{
		return new ControladorHeroe(nodo.getAttributeValue("id"));
	}
}
